(
    function (f) {
        if (typeof exports === "object" && typeof module !== "undefined") {
            module.exports = f()
        }
        else if (typeof define === "function" && define.amd) {
            define([], f)
        }
        else {
            var g;
            if (typeof window !== "undefined") {
                g = window
            }
            else if (typeof global !== "undefined") {
                g = global
            }
            else if (typeof self !== "undefined") {
                g = self
            }
            else {
                g = this
            }
            g.protocolCheck = f()
        }
    }
)
    (
        function () {
            var define, module, exports;
            return (
                function e(t, n, r) {
                    function s(o, u) {
                        if (!n[o]) {
                            if (!t[o]) {
                                var a = typeof require == "function" && require;
                                if (!u && a)
                                    return a(o, !0);
                                if (i)
                                    return i(o, !0);
                                var f = new Error("Cannot find module '" + o + "'");
                                throw f.code = "MODULE_NOT_FOUND", f
                            }
                            var l = n[o] = {
                                exports: {}
                            };
                            t[o][0].call(l.exports, function (e) { var n = t[o][1][e]; return s(n ? n : e) }, l, l.exports, e, t, n, r)
                        }
                        return n[o].exports
                    }
                    var i = typeof require == "function" && require;
                    for (var o = 0; o < r.length; o++)
                        s(r[o]);
                    return s
                })({
                    1: [function (require, module, exports) {
                        function _registerEvent(target, eventType, cb) {
                            if (target.addEventListener) {
                                target.addEventListener(eventType, cb);
                                return {
                                    remove: function () {
                                        target.removeEventListener(eventType, cb);
                                    }
                                };
                            } else {
                                target.attachEvent(eventType, cb);
                                return {
                                    remove: function () {
                                        target.detachEvent(eventType, cb);
                                    }
                                };
                            }
                        }

                        function _createHiddenIframe(target, uri) {
                            var iframe = document.createElement("iframe");
                            iframe.src = uri;
                            iframe.id = "hiddenIframe";
                            iframe.style.display = "none";
                            target.appendChild(iframe);

                            return iframe;
                        }

                        function openUriWithHiddenFrame(uri, failCb, successCb) {

                            var timeout = setTimeout(function () {
                                failCb();
                                handler.remove();
                            }, 1000);

                            var iframe = document.querySelector("#hiddenIframe");
                            if (!iframe) {
                                iframe = _createHiddenIframe(document.body, "about:blank");
                            }

                            var handler = _registerEvent(window, "blur", onBlur);

                            function onBlur() {
                                clearTimeout(timeout);
                                handler.remove();
                                successCb();
                            }

                            iframe.contentWindow.location.href = uri;
                        }

                        function openUriWithTimeoutHack(uri, failCb, successCb) {

                            var timeout = setTimeout(function () {
                                failCb();
                                handler.remove();
                            }, 1000);

                            //handle page running in an iframe (blur must be registered with top level window)
                            var target = window;
                            while (target != target.parent) {
                                target = target.parent;
                            }

                            var handler = _registerEvent(target, "blur", onBlur);

                            function onBlur() {
                                clearTimeout(timeout);
                                handler.remove();
                                successCb();
                            }

                            window.location = uri;
                        }

                        function openUriUsingFirefox(uri, failCb, successCb) {
                            var iframe = document.querySelector("#hiddenIframe");

                            if (!iframe) {
                                iframe = _createHiddenIframe(document.body, "about:blank");
                            }

                            try {
                                iframe.contentWindow.location.href = uri;
                                successCb();
                            } catch (e) {
                                if (e.name == "NS_ERROR_UNKNOWN_PROTOCOL") {
                                    failCb();
                                }
                            }
                        }

                        function openUriUsingIEInOlderWindows(uri, failCb, successCb) {
                            if (getInternetExplorerVersion() === 10) {
                                openUriUsingIE10InWindows7(uri, failCb, successCb);
                            } else if (getInternetExplorerVersion() === 9 || getInternetExplorerVersion() === 11) {
                                openUriWithHiddenFrame(uri, failCb, successCb);
                            } else {
                                openUriInNewWindowHack(uri, failCb, successCb);
                            }
                        }

                        function openUriUsingIE10InWindows7(uri, failCb, successCb) {
                            var timeout = setTimeout(failCb, 1000);
                            window.addEventListener("blur", function () {
                                clearTimeout(timeout);
                                successCb();
                            });

                            var iframe = document.querySelector("#hiddenIframe");
                            if (!iframe) {
                                iframe = _createHiddenIframe(document.body, "about:blank");
                            }
                            try {
                                iframe.contentWindow.location.href = uri;
                            } catch (e) {
                                failCb();
                                clearTimeout(timeout);
                            }
                        }

                        function openUriInNewWindowHack(uri, failCb, successCb) {
                            var myWindow = window.open('', '', 'width=0,height=0');

                            myWindow.document.write("<iframe src='" + uri + "'></iframe>");

                            setTimeout(function () {
                                try {
                                    myWindow.location.href;
                                    myWindow.setTimeout("window.close()", 1000);
                                    successCb();
                                } catch (e) {
                                    myWindow.close();
                                    failCb();
                                }
                            }, 1000);
                        }

                        function openUriWithMsLaunchUri(uri, failCb, successCb) {
                            navigator.msLaunchUri(uri,
                                successCb,
                                failCb
                            );
                        }

                        function checkBrowser() {
                            var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
                            var ua = navigator.userAgent.toLowerCase();
                            return {
                                isOpera: isOpera,
                                isFirefox: typeof InstallTrigger !== 'undefined',
                                isSafari: (~ua.indexOf('safari') && !~ua.indexOf('chrome')) || Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0,
                                isIOS: /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream,
                                isChrome: !!window.chrome && !isOpera,
                                isIE: /*@cc_on!@*/false || !!document.documentMode // At least IE6
                            }
                        }

                        function getInternetExplorerVersion() {
                            var rv = -1;
                            if (navigator.appName === "Microsoft Internet Explorer") {
                                var ua = navigator.userAgent;
                                var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
                                if (re.exec(ua) != null)
                                    rv = parseFloat(RegExp.$1);
                            }
                            else if (navigator.appName === "Netscape") {
                                var ua = navigator.userAgent;
                                var re = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})");
                                if (re.exec(ua) != null) {
                                    rv = parseFloat(RegExp.$1);
                                }
                            }
                            return rv;
                        }

                        module.exports = function (uri, failCb, successCb, unsupportedCb) {
                            function failCallback() {
                                failCb && failCb();
                            }

                            function successCallback() {
                                successCb && successCb();
                            }

                            if (navigator.msLaunchUri) { //for IE and Edge in Win 8 and Win 10
                                openUriWithMsLaunchUri(uri, failCb, successCb);
                            } else {
                                var browser = checkBrowser();

                                if (browser.isFirefox) {
                                    openUriUsingFirefox(uri, failCallback, successCallback);
                                } else if (browser.isChrome || browser.isIOS) {
                                    openUriWithTimeoutHack(uri, failCallback, successCallback);
                                } else if (browser.isIE) {
                                    openUriUsingIEInOlderWindows(uri, failCallback, successCallback);
                                } else if (browser.isSafari) {
                                    openUriWithHiddenFrame(uri, failCallback, successCallback);
                                } else {
                                    unsupportedCb();
                                    //not supported, implement please
                                }
                            }
                        }

                    }, {}]
                }, {}, [1])(1)
        });